{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [],
   "source": [
    "import geatpy as ea\n",
    "import numpy as np"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "==================================================================================\n",
      "gen|  eval  |    f_opt    |    f_max    |    f_avg    |    f_min    |    f_std    \n",
      "----------------------------------------------------------------------------------\n",
      " 0 |   20   | 4.13333E+00 | 7.93333E+00 | 5.48833E+00 | 4.13333E+00 | 9.60282E-01 \n",
      " 1 |   40   | 3.16667E+00 | 4.86667E+00 | 4.41000E+00 | 3.16667E+00 | 4.50568E-01 \n",
      " 2 |   60   | 3.16667E+00 | 4.30000E+00 | 3.88500E+00 | 3.16667E+00 | 4.11295E-01 \n",
      " 3 |   80   | 2.86667E+00 | 3.73333E+00 | 3.26333E+00 | 2.86667E+00 | 2.03825E-01 \n",
      " 4 |  100   | 2.60000E+00 | 3.16667E+00 | 3.04333E+00 | 2.60000E+00 | 1.71626E-01 \n",
      " 5 |  120   | 2.40000E+00 | 3.16667E+00 | 2.81833E+00 | 2.40000E+00 | 2.24963E-01 \n",
      " 6 |  140   | 2.30000E+00 | 2.83333E+00 | 2.55333E+00 | 2.30000E+00 | 1.46211E-01 \n",
      " 7 |  160   | 2.16667E+00 | 2.46667E+00 | 2.38833E+00 | 2.16667E+00 | 6.60597E-02 \n",
      " 8 |  180   | 2.13333E+00 | 2.40000E+00 | 2.27667E+00 | 2.13333E+00 | 6.83943E-02 \n",
      " 9 |  200   | 1.93333E+00 | 2.30000E+00 | 2.18167E+00 | 1.93333E+00 | 7.41433E-02 \n",
      " 10|  220   | 1.86667E+00 | 2.16667E+00 | 2.10000E+00 | 1.86667E+00 | 8.81917E-02 \n",
      " 11|  240   | 1.53333E+00 | 2.13333E+00 | 2.01000E+00 | 1.53333E+00 | 1.46477E-01 \n",
      " 12|  260   | 1.53333E+00 | 2.03333E+00 | 1.83500E+00 | 1.53333E+00 | 1.60026E-01 \n",
      " 13|  280   | 1.53333E+00 | 1.83333E+00 | 1.69667E+00 | 1.53333E+00 | 1.29056E-01 \n",
      " 14|  300   | 1.50000E+00 | 1.56667E+00 | 1.54333E+00 | 1.50000E+00 | 1.85592E-02 \n",
      " 15|  320   | 1.50000E+00 | 1.53333E+00 | 1.52667E+00 | 1.50000E+00 | 1.33333E-02 \n",
      " 16|  340   | 1.50000E+00 | 1.53333E+00 | 1.52167E+00 | 1.50000E+00 | 1.58990E-02 \n",
      " 17|  360   | 1.50000E+00 | 1.53333E+00 | 1.50833E+00 | 1.50000E+00 | 1.44338E-02 \n",
      " 18|  380   | 1.50000E+00 | 1.50000E+00 | 1.50000E+00 | 1.50000E+00 | 0.00000E+00 \n",
      " 19|  400   | 1.50000E+00 | 1.50000E+00 | 1.50000E+00 | 1.50000E+00 | 0.00000E+00 \n",
      " 20|  420   | 1.50000E+00 | 1.50000E+00 | 1.50000E+00 | 1.50000E+00 | 0.00000E+00 \n",
      " 21|  440   | 1.36667E+00 | 1.50000E+00 | 1.48667E+00 | 1.36667E+00 | 3.55903E-02 \n",
      " 22|  460   | 1.36667E+00 | 1.50000E+00 | 1.46000E+00 | 1.36667E+00 | 5.22813E-02 \n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXgAAAEWCAYAAABsY4yMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAA7Y0lEQVR4nO3dd3gU1frA8e+7CSFAKIYSQVroPaGDiFKkqIjSwYYVy9Uf1qt4LVzlXjtgRwErCLmAWBBBkSaKIqH3GqRKACkJJe38/jibkEASQrKzm+y+n+eZZ2Zns+ecHZZ3Z8+ceY8YY1BKKeV/XL5ugFJKKWdogFdKKT+lAV4ppfyUBnillPJTGuCVUspPaYBXSik/pQFeKYeJSJyIXO3rdqjAowFeFTkikpBpSRORU5ke3+yjNhkRSXS3Ya+IjBaRoIsso5OI7HGqjSrwBPu6AUpdLGNMWPq2iMQBdxtj5p37dyISbIxJ8WLToowx20SkAbAQ2AKM82L9SmWhZ/DKb6SfAYvIkyJyAPhYRC4RkVkiEi8if7u3q2Z6TbiIfCwi+9zPf5XpuV4iskpEjorIryLSLC/tMMZsAn4GmmTTxuIiMtZd3z73dnERKQV8D1TJ9GukSkGPiQpsGuCVv7kUCAdqAMOwn/GP3Y+rA6eAdzL9/edASaAxUAkYAyAizYGPgHuB8sAHwDciUvxCDRCRRkBHYGU2T/8LaAdEA1FAG+AZY0wicA2wzxgT5l72XcwbV+pcGuCVv0kDnjfGnDHGnDLGHDbGzDDGnDTGnAD+A1wFICKVsUH1PmPM38aYZGPMInc5w4APjDG/G2NSjTGfAmewwTknK0Tkb+BbYAL2i+VcNwMvGGMOGmPigX8Dt3rgfSt1Hu2DV/4m3hhzOv2BiJTEnpX3BC5x7y7tvgBaDThijPk7m3JqAENF5KFM+0KA3LpNWhhjtl2gfVWAXZke77pAmUrlm57BK39zbnrUx4D6QFtjTBngSvd+AXYD4SJSLptydgP/McaUy7SUNMZMKWD79mG/PNJVd+/Lru1KFYgGeOXvSmP73Y+KSDjwfPoTxpj92Aub77kvxhYTkfQvgPHAfSLSVqxSInKdiJQuYHumAM+ISEURqQA8B0xyP/cXUF5EyhawDqUADfDK/40FSgCHgN+AOec8fyuQDGwCDgIPAxhjlgP3YC/I/g1sA273QHtGAcuBNcBaYIV7X/romynADvfIHe26UQUiOuGHUkr5Jz2DV0opP6UBXiml/JQGeKWU8lMa4JVSyk8VqhudKlSoYCpWrEipUqV83ZRCJTExUY/JOfSYnE+PSfb8/bjExsYeMsZUzO65QhXga9asyeuvv06nTp183ZRCZeHChXpMzqHH5Hx6TLLn78dFRHbl9Jx20SillJ/SAK+UUn5KA7xSSvmpQtUHr1RRkZyczJ49ezh9+vSF/9hLypYty8aNG33djELHX45LaGgoVatWpVixYnl+jQZ4pfJhz549lC5dmpo1ayIivm4OACdOnKB06YLmQvM//nBcjDEcPnyYPXv2EBkZmefXaReNUvlw+vRpypcvX2iCu/JvIkL58uUv+hejBnil8kmDu/Km/HzeinyAnzQJKlaEJudNb6yUUoGtyAf4EiXg0CHYuBHS0nzdGqW866uvvkJE2LRpk6+bckHHjh3jtttuo06dOtSuXZvbbruNY8eOAfZmpF69emX7umuvvZajR49edH0LFy7k119/zXg8btw4Pvvss3y1Pd2iRYto3759ln0pKSlERESwb1/2c6Tn9t6cVuQDfJ8+4HLZ4D5rlq9bo5R3TZkyhSuuuIIpUwo6k6CVmprqkXKyc9ddd1GrVi22bdvG9u3biYyM5O67777g62bPnk25cuUuur5zA/x9993HbbfddtHlZNaxY0f27NnDrl1nbx6dN28ejRs3pkqVwjc/S5EP8C4XVK9utz/91LdtUcqbEhISWLJkCRMnTmTq1KkAzJkzhwEDBmT8Teazxx9++IH27dvTokULBgwYQEJCAmBThDz55JO0aNGCadOmMX78eFq3bk1UVBT9+vXj5MmTAGzfvp127drRtGlTnnnmGcLCwjLqee2112jdujXNmjXj+eczZkXMsG3bNmJjY3n22Wcz9j333HMsX76c7du3A3D8+HGuu+466tevz3333Uea+yd5zZo1OXToEACTJk2iTZs2REdHc++992Z8Ic2ZM4cWLVoQFRVF165diYuLY9y4cYwZM4YOHTrw888/M3LkSF5//XU2bdpEmzZtMtoRFxdH06ZNAYiNjeWqq66iZcuW9OjRg/3792d5Hy6Xi4EDB2Ycb4CpU6cyZMgQli1bRvv27WnevDmXX345mzdvPu84pLchXZMmTYiLi8v1vRVEkQ/wAFdfbddLlvi2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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Execution time: 0.015975475311279297 s\n",
      "Evaluation number: 460\n",
      "The best objective value is: 1.3666666666666667\n",
      "The best variables are: \n",
      "0\t0\t2\t1\t1\t0\t-1\t0\t2\t2\t2\t1\t1\t2\t3\t2\t0\t1\t0\t-1\t0\t2\t0\t1\t3\t2\t1\t3\t-1\t2\t\n"
     ]
    }
   ],
   "source": [
    "# 构建问题\n",
    "r = 1  # 目标函数需要用到的额外数据\n",
    "dim = 30 # 600 个变量好像优化不好\n",
    "@ea.Problem.single\n",
    "def evalVars(Vars):  # 定义目标函数（含约束）\n",
    "    f = np.sum((Vars - r) ** 2)/dim  # 计算目标函数值\n",
    "    # x1 = Vars[0]\n",
    "    # x2 = Vars[1]\n",
    "    # CV = np.array([(x1 - 0.5)**2 - 0.25,\n",
    "    #                 (x2 - 1)**2 - 1])  # 计算违反约束程度\n",
    "    CV = np.array([f-2000])\n",
    "    return f, CV\n",
    "# dim = 600 # 600 个变量好像优化不好\n",
    "varTypes = np.ones(dim) # 整数\n",
    "# varTypes = np.zeros(dim) # 实数\n",
    "# lb = np.ones(dim)*1\n",
    "# ub = np.ones(dim)*20\n",
    "lb = np.ones(dim)*-3\n",
    "ub = np.ones(dim)*3\n",
    "problem = ea.Problem(name='soea quick start demo',\n",
    "                        M=1,  # 目标维数\n",
    "                        maxormins=[1],  # 目标最小最大化标记列表，1：最小化该目标；-1：最大化该目标\n",
    "                        Dim=dim,  # 决策变量维数\n",
    "                        varTypes=varTypes,  # 决策变量的类型列表，0：实数；1：整数\n",
    "                        lb=lb,  # 决策变量下界\n",
    "                        ub=ub,  # 决策变量上界\n",
    "                        evalVars=evalVars)\n",
    "# 构建算法\n",
    "algorithm = ea.soea_SEGA_templet(problem,\n",
    "                                    ea.Population(Encoding='RI', NIND=20),\n",
    "                                    MAXGEN=500,  # 最大进化代数。\n",
    "                                    logTras=1,  # 表示每隔多少代记录一次日志信息，0表示不记录。\n",
    "                                    trappedValue=1e-6,  # 单目标优化陷入停滞的判断阈值。\n",
    "                                    maxTrappedCount=10)  # 进化停滞计数器最大上限值。\n",
    "# 求解\n",
    "res = ea.optimize(algorithm, seed=1, verbose=True, drawing=1, outputMsg=True, drawLog=False, saveFlag=True, dirName='result')"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "398\n"
     ]
    },
    {
     "data": {
      "text/plain": "0.8015075376884422"
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import linear_model as model\n",
    "import src.project1.submit.AI as ai\n",
    "from experiment.评估函数.simulator import Simulator\n",
    "from experiment.评估函数.greedy_ai import GreedyAI\n",
    "import experiment.评估函数.greedys as greedys\n",
    "chessboard_size = 8\n",
    "time_out = 5\n",
    "def greedy_fun(Vars):\n",
    "    PVT, PVT_max = model.get_PVT_and_max(Vars)\n",
    "    return lambda a, p : model.value_of_positions(a.reversi_env.updated_chessboard(a.chessboard, a.color, p), a.color, PVT, PVT_max)\n",
    "# def evalWinRate(Vars, diff=0.001, at_least_times=20):\n",
    "def evalWinRate(Vars, diff=0.001, at_least_times=20):\n",
    "    wins = 0\n",
    "    cnts = 0\n",
    "    prev_prob = np.ones(at_least_times)*100  # 不合法\n",
    "    prob = -1 # 不合法\n",
    "    while np.absolute(prob-prev_prob).sum()>at_least_times*diff or prob==1:\n",
    "        for i_color in [ai.COLOR_BLACK, ai.COLOR_WHITE]:\n",
    "            agents = {i_color: GreedyAI(chessboard_size, i_color, greedy_fun(Vars)),\n",
    "                  -i_color: GreedyAI(chessboard_size, -i_color, greedys.random_baseline)}\n",
    "            simulator = Simulator(chessboard_size, time_out, agents)\n",
    "            winner = simulator.quick_run(no_print=True)\n",
    "            if winner != i_color:\n",
    "                # print(\"loss\")\n",
    "                pass\n",
    "            else:\n",
    "                # print(\"win\")\n",
    "                wins += 1\n",
    "            cnts += 1\n",
    "            prev_prob = np.append(prev_prob[1:], prob)\n",
    "            prob = wins/cnts\n",
    "    print(cnts)\n",
    "    return prob\n",
    "# evalWinRate(np.array([1, 8, 3, 7, 3, 2, 5, 6, 6, 4]))\n",
    "# 实验结果: diff为0.001时，338才收敛，估算出0.7603\n",
    "# diff为 0.01时，50次收敛, 估算出0.66\n",
    "# evalWinRate(np.array([9, 10, 18, 5, 19,15, 18, 13, 8, 3]))  # 演化结果1 0.8571\n",
    "# evalWinRate(np.array([-1, 10, 18, 5, 19,15, 18, 13, 8, 3]))  # 0.75\n",
    "# evalWinRate(np.array([3, 20, 5, 5, 18,15, 18, 13, 8, 3])) # 先验知识调参 0.6\n",
    "# evalWinRate(np.array([16,14,18,18,20,20,13,12,18,15])) # 演化结果2 0.72\n",
    "evalWinRate(np.array([0.58294678,  0.32422638,  0.30072021,  0.04949951,  0.74310493,\n",
    "         0.26721382,  0.05133057,  0.72602844, -0.12939453, -0.73083496])) # 0.80"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "outputs": [
    {
     "data": {
      "text/plain": "-0.5"
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def evalBetterThanNeighbour(Vars):\n",
    "    cnt = 0\n",
    "    for neighbour in model.neighbours(Vars):\n",
    "        for i_color in [ai.COLOR_BLACK, ai.COLOR_WHITE]:\n",
    "            agents = {i_color: GreedyAI(chessboard_size, i_color, greedy_fun(Vars)),\n",
    "                  -i_color: GreedyAI(chessboard_size, -i_color, greedy_fun(neighbour))}\n",
    "            simulator = Simulator(chessboard_size, time_out, agents)\n",
    "            winner = simulator.quick_run(no_print=True)\n",
    "            if winner != i_color:\n",
    "                cnt+=1\n",
    "    # 一般有40次对决\n",
    "    return (cnt/40)-0.5 # 违反约束的程度，被很多邻居打败就违反了\n",
    "# evalBetterThanNeighbour(np.array([1, 8, 3, 7, 3, 2, 5, 6, 6, 4]))\n",
    "# evalBetterThanNeighbour(np.array([9, 10, 18, 5, 19,15, 18, 13, 8, 3]))\n",
    "# evalBetterThanNeighbour(np.array([3, 10, 18, 5, 19,15, 18, 13, 8, 3]))\n",
    "evalBetterThanNeighbour(np.array([16,14,18,18,20,20,13,12,18,15]))"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "492\n",
      "432\n",
      "486\n",
      "494\n",
      "416\n",
      "472\n",
      "504\n",
      "530\n",
      "366\n",
      "544\n",
      "536\n",
      "600\n",
      "420\n",
      "384\n",
      "352\n",
      "518\n",
      "514\n",
      "412\n",
      "466\n",
      "436\n",
      "==================================================================================\n",
      "gen|  eval  |    f_opt    |    f_max    |    f_avg    |    f_min    |    f_std    \n",
      "----------------------------------------------------------------------------------\n",
      " 0 |   20   | 6.15385E-01 | 6.15385E-01 | 4.31707E-01 | 2.21591E-01 | 1.16076E-01 \n",
      "548\n",
      "554\n",
      "524\n",
      "438\n",
      "404\n",
      "448\n",
      "444\n",
      "540\n",
      "504\n",
      "534\n",
      "492\n",
      "506\n",
      "408\n",
      "450\n",
      "530\n",
      "348\n",
      "304\n",
      "564\n",
      "468\n",
      "354\n",
      " 1 |   40   | 6.27863E-01 | 6.27863E-01 | 5.44390E-01 | 4.81481E-01 | 4.51446E-02 \n",
      "572\n",
      "340\n",
      "496\n",
      "554\n",
      "544\n",
      "382\n",
      "512\n",
      "420\n",
      "526\n",
      "354\n",
      "436\n",
      "538\n",
      "432\n",
      "422\n",
      "424\n",
      "368\n",
      "486\n",
      "538\n",
      "382\n",
      "526\n",
      " 2 |   60   | 6.70157E-01 | 6.70157E-01 | 6.01736E-01 | 5.55556E-01 | 3.11543E-02 \n",
      "428\n",
      "384\n",
      "498\n",
      "520\n",
      "486\n",
      "520\n",
      "514\n",
      "486\n",
      "356\n",
      "364\n",
      "396\n",
      "522\n",
      "436\n",
      "506\n",
      "402\n",
      "466\n",
      "482\n",
      "468\n",
      "424\n",
      "522\n",
      " 3 |   80   | 6.79104E-01 | 6.79104E-01 | 6.39432E-01 | 6.13169E-01 | 1.94787E-02 \n",
      "474\n",
      "530\n",
      "428\n",
      "416\n",
      "528\n",
      "366\n",
      "532\n",
      "448\n",
      "422\n",
      "510\n",
      "422\n",
      "464\n",
      "416\n",
      "466\n",
      "410\n",
      "386\n",
      "496\n",
      "416\n",
      "458\n",
      "560\n",
      " 4 |  100   | 6.87500E-01 | 6.87500E-01 | 6.56194E-01 | 6.34615E-01 | 1.32708E-02 \n",
      "478\n",
      "474\n",
      "422\n",
      "386\n",
      "416\n",
      "394\n",
      "488\n",
      "412\n",
      "450\n",
      "470\n",
      "500\n",
      "424\n",
      "454\n",
      "380\n",
      "366\n",
      "452\n",
      "536\n",
      "452\n",
      "460\n",
      "442\n",
      " 5 |  120   | 7.61792E-01 | 7.61792E-01 | 6.78651E-01 | 6.55602E-01 | 2.66996E-02 \n",
      "470\n",
      "574\n",
      "466\n",
      "474\n",
      "544\n",
      "442\n",
      "456\n",
      "522\n",
      "394\n",
      "426\n",
      "490\n",
      "478\n",
      "460\n",
      "452\n",
      "404\n",
      "582\n",
      "408\n",
      "386\n",
      "498\n",
      "470\n",
      " 6 |  140   | 7.61792E-01 | 7.61792E-01 | 6.89402E-01 | 6.63551E-01 | 2.39603E-02 \n",
      "414\n",
      "532\n",
      "510\n",
      "422\n",
      "382\n",
      "446\n",
      "436\n",
      "474\n",
      "528\n",
      "538\n",
      "592\n",
      "354\n",
      "482\n",
      "524\n",
      "502\n",
      "452\n",
      "600\n",
      "476\n",
      "402\n",
      "524\n",
      " 7 |  160   | 7.61792E-01 | 7.61792E-01 | 7.06515E-01 | 6.80498E-01 | 2.34725E-02 \n",
      "370\n",
      "412\n",
      "500\n",
      "394\n",
      "466\n",
      "544\n",
      "394\n",
      "498\n",
      "426\n",
      "526\n",
      "442\n",
      "366\n",
      "386\n",
      "400\n",
      "522\n",
      "410\n",
      "308\n",
      "440\n",
      "362\n",
      "422\n",
      " 8 |  180   | 7.90155E-01 | 7.90155E-01 | 7.34342E-01 | 7.10526E-01 | 2.12908E-02 \n",
      "448\n",
      "406\n",
      "358\n",
      "394\n",
      "450\n",
      "346\n",
      "436\n",
      "368\n",
      "382\n",
      "444\n",
      "320\n",
      "466\n",
      "402\n",
      "412\n",
      "370\n",
      "412\n",
      "406\n",
      "464\n",
      "424\n",
      "312\n",
      " 9 |  200   | 7.90155E-01 | 7.90155E-01 | 7.58267E-01 | 7.38397E-01 | 1.18820E-02 \n",
      "414\n",
      "380\n",
      "584\n",
      "392\n",
      "512\n",
      "386\n",
      "382\n",
      "384\n",
      "522\n",
      "404\n",
      "434\n",
      "430\n",
      "438\n",
      "398\n",
      "430\n",
      "434\n",
      "392\n",
      "470\n",
      "470\n",
      "386\n",
      " 10|  220   | 7.95349E-01 | 7.95349E-01 | 7.67223E-01 | 7.53125E-01 | 1.27625E-02 \n",
      "418\n",
      "402\n",
      "392\n",
      "518\n",
      "618\n",
      "418\n",
      "428\n",
      "426\n",
      "480\n",
      "546\n",
      "460\n",
      "352\n",
      "378\n",
      "360\n",
      "384\n",
      "324\n",
      "408\n",
      "456\n",
      "352\n",
      "482\n",
      " 11|  240   | 8.11224E-01 | 8.11224E-01 | 7.76520E-01 | 7.58152E-01 | 1.44882E-02 \n",
      "400\n",
      "378\n",
      "446\n",
      "394\n",
      "470\n",
      "516\n",
      "512\n",
      "366\n",
      "528\n",
      "398\n",
      "358\n",
      "494\n",
      "360\n",
      "482\n",
      "410\n",
      "354\n",
      "468\n",
      "436\n",
      "486\n",
      "436\n",
      " 12|  260   | 8.11224E-01 | 8.11224E-01 | 7.84727E-01 | 7.70142E-01 | 1.11201E-02 \n",
      "354\n",
      "428\n",
      "370\n",
      "390\n",
      "468\n",
      "380\n",
      "518\n",
      "406\n",
      "436\n",
      "384\n",
      "428\n",
      "502\n",
      "448\n",
      "434\n",
      "330\n",
      "354\n",
      "470\n",
      "336\n",
      "338\n",
      "422\n",
      " 13|  280   | 8.13559E-01 | 8.13559E-01 | 7.89803E-01 | 7.72936E-01 | 1.05004E-02 \n",
      "360\n",
      "400\n",
      "520\n",
      "344\n",
      "396\n",
      "400\n",
      "420\n",
      "336\n",
      "352\n",
      "452\n",
      "446\n",
      "330\n",
      "324\n",
      "410\n",
      "406\n",
      "390\n",
      "402\n",
      "546\n",
      "356\n",
      "430\n",
      " 14|  300   | 8.20988E-01 | 8.20988E-01 | 7.93967E-01 | 7.80303E-01 | 1.07921E-02 \n",
      "388\n",
      "456\n",
      "456\n",
      "478\n",
      "454\n",
      "418\n",
      "322\n",
      "372\n",
      "352\n",
      "386\n",
      "474\n",
      "440\n",
      "472\n",
      "402\n",
      "510\n",
      "524\n",
      "308\n",
      "396\n",
      "396\n",
      "364\n",
      " 15|  320   | 8.28283E-01 | 8.28283E-01 | 8.00941E-01 | 7.84884E-01 | 1.30893E-02 \n",
      "346\n",
      "506\n",
      "370\n",
      "358\n",
      "412\n",
      "414\n",
      "390\n",
      "478\n",
      "358\n",
      "568\n",
      "516\n",
      "464\n",
      "434\n",
      "380\n",
      "394\n",
      "308\n",
      "472\n",
      "398\n",
      "404\n",
      "360\n",
      " 16|  340   | 8.49711E-01 | 8.49711E-01 | 8.07578E-01 | 7.90816E-01 | 1.51704E-02 \n",
      "518\n",
      "400\n",
      "406\n",
      "476\n",
      "482\n",
      "368\n",
      "494\n",
      "356\n",
      "492\n",
      "376\n",
      "334\n",
      "334\n",
      "366\n",
      "428\n",
      "370\n",
      "378\n",
      "370\n",
      "382\n",
      "550\n",
      "328\n",
      " 17|  360   | 8.49711E-01 | 8.49711E-01 | 8.10645E-01 | 7.91892E-01 | 1.50422E-02 \n",
      "382\n",
      "482\n",
      "384\n",
      "422\n",
      "326\n",
      "512\n",
      "390\n",
      "372\n",
      "374\n",
      "442\n",
      "280\n",
      "314\n",
      "448\n",
      "324\n",
      "430\n",
      "376\n",
      "518\n",
      "382\n",
      "346\n",
      "448\n",
      " 18|  380   | 8.53488E-01 | 8.53488E-01 | 8.19076E-01 | 8.01724E-01 | 1.42165E-02 \n",
      "396\n",
      "502\n",
      "506\n",
      "336\n",
      "350\n",
      "382\n",
      "494\n",
      "408\n",
      "352\n",
      "460\n",
      "436\n",
      "478\n",
      "406\n",
      "348\n",
      "474\n",
      "444\n",
      "472\n",
      "508\n",
      "330\n",
      "376\n",
      " 19|  400   | 8.53488E-01 | 8.53488E-01 | 8.22807E-01 | 8.09783E-01 | 1.16217E-02 \n",
      "388\n",
      "392\n",
      "396\n",
      "428\n",
      "480\n",
      "472\n",
      "448\n",
      "428\n",
      "406\n",
      "434\n",
      "400\n",
      "366\n",
      "360\n",
      "486\n",
      "330\n",
      "442\n",
      "396\n",
      "394\n",
      "468\n",
      "382\n",
      " 20|  420   | 8.53488E-01 | 8.53488E-01 | 8.29460E-01 | 8.18653E-01 | 9.25683E-03 \n",
      "336\n",
      "438\n",
      "360\n",
      "366\n",
      "342\n",
      "384\n",
      "368\n",
      "448\n",
      "360\n",
      "414\n",
      "376\n",
      "554\n",
      "354\n",
      "394\n",
      "316\n",
      "384\n",
      "400\n",
      "396\n",
      "452\n",
      "422\n",
      " 21|  440   | 8.53488E-01 | 8.53488E-01 | 8.34024E-01 | 8.24201E-01 | 9.12717E-03 \n",
      "478\n",
      "370\n",
      "308\n",
      "476\n",
      "464\n",
      "338\n",
      "372\n",
      "346\n",
      "366\n",
      "446\n",
      "466\n",
      "408\n",
      "402\n",
      "454\n",
      "452\n",
      "404\n",
      "382\n",
      "336\n",
      "372\n",
      "372\n",
      " 22|  460   | 8.53488E-01 | 8.53488E-01 | 8.35919E-01 | 8.27273E-01 | 8.01778E-03 \n",
      "526\n",
      "444\n",
      "344\n",
      "408\n",
      "376\n",
      "426\n",
      "428\n",
      "512\n",
      "384\n",
      "512\n",
      "428\n",
      "332\n",
      "398\n",
      "332\n",
      "400\n",
      "376\n",
      "386\n",
      "334\n",
      "330\n",
      "390\n",
      " 23|  480   | 8.53488E-01 | 8.53488E-01 | 8.37806E-01 | 8.28283E-01 | 7.83958E-03 \n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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W1K7dm1WrFhB//79+fnnnzl69CgAycnJDBs2jL179zJp0iS+/vprVqxYQefOnXnhhRc824qJieH7779n+PDhDBo0iGXLlrFy5Upat27Nu+++C8Dtt9/O7bffzrJly2jQoIHntQsWLGDTpk0sXbqUtLQ0UlNTWbJkiU+sa9euJSEhgcjISM+6yMhIEhISWLPGllFbunQpzz//PL/++itbtmzh/9xXqLqsW7eO5ORkFi5cSFpaGpGRkXz44Yfs2bOHm2++mU8//ZSVK1cye/ZsmjRpwtixY7nzzjtJS0ujd+/enu20bt2anJwctm7d6mmja6+9lhMnTjB+/Hg++eQTUlNT+dvf/sY///nPU9p9xIgRnkR8/Phx5s+fz+DBg2nVqhVLlizhl19+4bHHHmPixIlF/rd0v7cffvjB5735W0CvYyjNDh4EV7elji+ooAj+pZvWzJkzueOOOwAYPnw4M2fOpGPHjgwcOJDPP/+cIUOG8N///pdnnnmGxYsXs3btWnr27AlATk6OT1/5sGHDPMurV6/mX//6FwcPHiQzM5MBritEf/rpJ+a6Tve77rrruOeeewCbGBYsWECHDh0AeySzadMm+vTp49mmMSbfs2q813fp0oWmTZsC9sv3+++/Z8iQIZ7nfvPNN6SmppKUlERERATHjh2jXr16/Pzzz/Tp08dzfn/t2rVP23bXXnstH3/8MQ888ADJyckkJyezYcMGVq9eTf/+/QHbrZZf91BiYiKZmZls2LCBdevW0a1bN2rVqsXOnTsZNWoUmzZtQkQ4ceLEaePI+94SExMBPO/N38I2MUyfbm91fEGVZ/v27ePbb79l9erViAgnT55ERHjmmWcYNmwYr732GrVr1yYxMZFq1aphjKF///7MnDkz3+1VqVLFs/yXv/yFuXPnEh8fz/Tp009bwdMYw4QJE7jlllsKfE7btm355ZdfcDqdRETYDg2n0+k5KklPTz8lceS9b4xh1KhRTJw40ecCt3nz5hX7VM5hw4YxdOhQBg0ahIjQokULfv31V9q2bctPP/102tcPHz6cWbNmsW7dOkaMGAHAgw8+SN++fZkzZw7btm0jKSnplNdFRUV5usgAz3UJ7vf25JNPFut9FFfYdiW5r19o3TqkYSgVUJ988gkjR45k+/btbNu2jZ07dxIXF8f3339PUlISK1as4O233/YcCXTr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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Execution time: 10022.800121068954 s\n",
      "Evaluation number: 480\n",
      "The best objective value is: 0.8534883720930233\n",
      "The best variables are: \n",
      "0.58294677734375\t0.32422637939453125\t0.30072021484375\t0.04949951171875\t0.7431049346923828\t0.2672138214111328\t0.05133056640625\t0.7260284423828125\t-0.12939453125\t-0.7308349609375\t\n"
     ]
    }
   ],
   "source": [
    "# 构建问题\n",
    "@ea.Problem.single\n",
    "def evalVars(Vars):  # 定义目标函数（含约束）\n",
    "    f = evalWinRate(Vars)  # 计算目标函数值\n",
    "    CV = np.array(evalBetterThanNeighbour(Vars))\n",
    "    # f = evalBetterThanNeighbour(Vars)  # 计算目标函数值\n",
    "    # CV = np.array(0.5-evalWinRate(Vars))\n",
    "    return f, CV\n",
    "dim = 10\n",
    "# varTypes = np.ones(dim) # 整数\n",
    "varTypes = np.zeros(dim) # 实数\n",
    "# lb = np.ones(dim)*1\n",
    "# ub = np.ones(dim)*20\n",
    "lb = np.ones(dim)*-1\n",
    "ub = np.ones(dim)*1\n",
    "problem = ea.Problem(name='演化计算求解最优评估函数',\n",
    "                        M=1,  # 目标维数\n",
    "                        maxormins=[-1],  # 目标最小最大化标记列表，1：最小化该目标；-1：最大化该目标\n",
    "                        # maxormins=[1],  # 目标最小最大化标记列表，1：最小化该目标；-1：最大化该目标\n",
    "                        Dim=dim,  # 决策变量维数\n",
    "                        varTypes=varTypes,  # 决策变量的类型列表，0：实数；1：整数\n",
    "                        lb=lb,  # 决策变量下界\n",
    "                        ub=ub,  # 决策变量上界\n",
    "                        evalVars=evalVars)\n",
    "# 构建算法\n",
    "algorithm = ea.soea_SEGA_templet(problem,\n",
    "                                    ea.Population(Encoding='RI', NIND=20),\n",
    "                                    MAXGEN=50,  # 最大进化代数。\n",
    "                                    # MAXGEN=10,  # 最大进化代数。\n",
    "                                    logTras=1,  # 表示每隔多少代记录一次日志信息，0表示不记录。\n",
    "                                    trappedValue=1e-6,  # 单目标优化陷入停滞的判断阈值。\n",
    "                                    maxTrappedCount=10)  # 进化停滞计数器最大上限值。\n",
    "# 求解\n",
    "res = ea.optimize(algorithm, seed=1, verbose=True, drawing=1, outputMsg=True, drawLog=False, saveFlag=True, dirName='result')\n",
    "# 第一次实验（离散0-20，胜率为目标，打败邻居为约束）\n",
    "# Execution time: 832.7836029529572 s\n",
    "# Evaluation number: 220\n",
    "# The best objective value is: 1.0\n",
    "# The best variables are:\n",
    "# 9\t10\t18\t5\t19\t15\t18\t13\t8\t3\n",
    "# 第二次实验：\n",
    "# Execution time: 1341.5104522705078 s\n",
    "# Evaluation number: 200\n",
    "# The best objective value is: -0.5\n",
    "# The best variables are:\n",
    "# 16\t14\t18\t18\t20\t20\t13\t12\t18\t15"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.10.5 64-bit",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.5"
  },
  "orig_nbformat": 4,
  "vscode": {
   "interpreter": {
    "hash": "d4ad195ff334c471a543b0a7bb226f1a689063219ec9cc66cee2dec60707a1ec"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}